package com.briup.cms.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.briup.cms.common.exception.CmsException;
import com.briup.cms.common.model.entity.User;
import com.briup.cms.common.model.ext.UserExt;
import com.briup.cms.common.util.JwtUtil;
import com.briup.cms.common.util.ResultCode;
import com.briup.cms.common.util.SecurityUtil;
import com.briup.cms.dao.UserMapper;
import com.briup.cms.service.AuthService;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.DigestUtils;

import java.lang.annotation.ElementType;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;

/**
 * Service层实现类 - 认证模块
 * 1、完成组件的基本配置
 * 1）将当前这个类注册成为SpringIoC容器中的一个Bean
 * 步骤：在类上添加@Service注解
 * 建议先将所有的Service上都添加该注解，防止项目启动失败。
 * 2）需要在当前类中引入用户模块Dao层对象（MyBatis映射接口实例）
 * 帮我们完成用户表的增删改查功能。
 * 步骤：在类中定义一个UserMapper类型的属性（全局变量），使用final修饰
 * 在当前类上添加@RequiredArgsConstructor注解，为其自动生成构造器
 * Spring构造当前类实例的时候就会自动调用该构造器将依赖注入进来
 * @author YuYan
 * @date 2024-01-09 19:43:09
 */
@Service
@RequiredArgsConstructor
public class AuthServiceImpl implements AuthService {

    private final UserMapper userMapper;
    private final JwtUtil jwtUtil;
    private final SecurityUtil securityUtil;
    /**
     * 用户登录
     * @param username 账号
     * @param password 密码
     * @return
     */
    @Override
    public String login(String username, String password) {
        LambdaQueryWrapper<User> lqw=new LambdaQueryWrapper<User>();
        lqw.eq(User::getUsername,username);
        User user=userMapper.selectOne(lqw);
        System.out.println(user);
        System.out.println(username);
        System.out.println(password);

        if(user==null){
            throw  new CmsException(ResultCode.DATA_WRONG);
        }
        if(!securityUtil.bcryptMatches(password,user.getPassword())){
            throw  new CmsException(ResultCode.USER_PASSWORD_INVALID);
        }
        if(!user.getStatus().equals("启用")) {
            throw new CmsException( ResultCode.DATA_WRONG);
        }
        Map<String,Object>map=new HashMap<>();
        map.put("userId",user.getId());
        map.put("username",user.getUsername());
        return jwtUtil.generate(map);
    }

    /**
     * 获取用户信息
     * @param token Token令牌
     * @return
     */
    @Override
    public UserExt getUserinfo(String token) {
        Map<String, Object> claims = jwtUtil.getClaims(token);
        Long userId = (Long) claims.get("userId");
        User user=userMapper.selectById(userId);
        UserExt userExt=UserExt.toExt(user);
        return userExt;
    }
}
